package co.edu.javeriana.touresbalon.oms.webservices.clients.bpel;

import co.edu.javeriana.touresbalon.b2c.entities.Hotel;
import co.edu.javeriana.touresbalon.b2c.entities.Producto;
import co.edu.javeriana.touresbalon.b2c.entities.Transporte;
import co.edu.javeriana.touresbalon.oms.entities.Customer;
import co.edu.javeriana.touresbalon.oms.entities.Orders;
import co.edu.javeriana.touresbalon.oms.entities.Traveler;
import co.edu.javeriana.touresbalon.oms.enumerations.OrderAction;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ada
 */
public class WSBPELClient {
    public void callOrderProcess(Orders newOrder, Producto newProduct){
        ServiceEntradaProcesarOrdenTB serviceBPEL=new ServiceEntradaProcesarOrdenTB();
        ExecutePtt executePtt=serviceBPEL.getExecutePt();
        
        EntradaProcesarOrdenTB entrada=new EntradaProcesarOrdenTB();
        
        entrada.setDatosCliente(crearCliente(newOrder));
        entrada.setDatosEspectaculo(crearEspectaculo(newProduct));
        entrada.setDatosOrden(crearOrden(newOrder,newProduct));
        entrada.setDatosReservaHospedaje(crearHospedaje(newProduct));
        entrada.setDatosReservaTransporte(crearTransporte(newProduct));
        entrada.setDatosTarjetaCredito(crearTarjetaCredito(newOrder));
        entrada.setDatosViajeros(crearDatosViajeros(newOrder));
        
        try {
            executePtt.execute(entrada);
        } catch (Exception E) {
            //evitar excepción del BUS pero continua normalmente hacia el BPEL.
        }
    }

    private Cliente crearCliente(Orders newOrder) {
        Cliente clienteBPEL=new Cliente();
        Customer customer=newOrder.getCustid();
        clienteBPEL.setTipoCliente(customer.getType());
        clienteBPEL.setNombre(customer.getFname());
        clienteBPEL.setIdentificacion(customer.getCustid());
        clienteBPEL.setEmail(customer.getEmail());
        clienteBPEL.setCelular(customer.getPhonenumber());
        clienteBPEL.setApellido(customer.getLname());
        return clienteBPEL;
    }

    private Espectaculo crearEspectaculo(Producto newProduct) {
        Espectaculo espectaculoBPEL=new Espectaculo();
        espectaculoBPEL.setIdEspectaculo(newProduct.getIdEspectaculo().getIdEspectaculo()+"");
        espectaculoBPEL.setPrecio(newProduct.getIdEspectaculo().getValorEspectaculo().doubleValue());
        return espectaculoBPEL;
    }

    private Orden crearOrden(Orders newOrder, Producto newProduct) {
        Orden orderBPEL=new Orden();
        orderBPEL.setAccion(OrderAction.PROCESAR.name());
        orderBPEL.setEstado(newOrder.getStatus());
        orderBPEL.setNumeroViajeros(newOrder.getNumTravelers());
        orderBPEL.setOrderId(newOrder.getOrderid());
        orderBPEL.setValorGananciaEspectaculo(newOrder.getNumTravelers()*newProduct.getIdEspectaculo().getValorEspectaculo().longValue());
        orderBPEL.setValorGananciaHospedaje(newOrder.getNumTravelers()*newProduct.getIdHotel().getHabitacionesList().get(0).getPrecioNoche().longValue());
        orderBPEL.setValorGananciaTransporte(newOrder.getNumTravelers()*newProduct.getTransporteCollection().get(0).getCostoSilla().longValue());
        orderBPEL.setValorTotalOrdenGanancia(newOrder.getPrice().doubleValue());
        return orderBPEL;
    }

    private ReservaTransporte crearTransporte(Producto newProduct) {
        ReservaTransporte reservaTransporteBPEL=new ReservaTransporte();
        Transporte transporte= newProduct.getTransporteCollection().get(0);
        reservaTransporteBPEL.setCiudadDestino(transporte.getCiudadDestino());
        reservaTransporteBPEL.setCiudadOrigen(transporte.getCiudadOrigen());
        reservaTransporteBPEL.setComidasPasabocas(transporte.getComidasPasabocas());
        reservaTransporteBPEL.setFechaLlegada(transporte.getFechaLlegada());
        reservaTransporteBPEL.setFechaSalida(transporte.getFechaSalida());
        reservaTransporteBPEL.setNumeroSilla(transporte.getNumeroSilla());
        reservaTransporteBPEL.setTipoTransporte(transporte.getTipoTransporte());
        reservaTransporteBPEL.setTipoViaje(transporte.getTipoViaje());
        reservaTransporteBPEL.setNumeroViaje(transporte.getIdTransporte()+"");
        reservaTransporteBPEL.setPrecio(transporte.getCostoSilla().doubleValue());  
        return reservaTransporteBPEL;
    }

    private ReservaHospedaje crearHospedaje(Producto newProduct) {
        ReservaHospedaje reservaHospedaje=new ReservaHospedaje();
        Hotel hotel=newProduct.getIdHotel();
        
        reservaHospedaje.setCheckin(hotel.getCheckin());
        reservaHospedaje.setCheckout(hotel.getCheckout());
        reservaHospedaje.setTipoHotel(hotel.getTipoHotel());
        reservaHospedaje.setIdHotel(hotel.getIdHotel()+"");
        reservaHospedaje.setNumeroHabitacion(hotel.getHabitacionesList().get(0).getIdHabitacion());
        reservaHospedaje.setPrecio(hotel.getHabitacionesList().get(0).getPrecioNoche().doubleValue());      
        return reservaHospedaje;
    }

    private TarjetaCredito crearTarjetaCredito(Orders newOrder) {
        TarjetaCredito tarjetaCreditoBPEL=new TarjetaCredito();
        Customer customer=newOrder.getCustid();
        tarjetaCreditoBPEL.setMonto(Double.valueOf(newOrder.getPrice().toString()));
        tarjetaCreditoBPEL.setNumero(customer.getCreditcardnumber());
        tarjetaCreditoBPEL.setTipo(customer.getCreditcardtype());
        return tarjetaCreditoBPEL;
    }

    private List<Viajero> crearDatosViajeros(Orders newOrder) {
        List<Traveler> travelers= newOrder.getTravelerList();
        List<Viajero> viajeros=new ArrayList<Viajero>();
        for (Traveler traveler : travelers) {
            Viajero viajero=new Viajero();
            viajero.setNombre(traveler.getFname());
            viajero.setIdentificacion(traveler.getTravelerid());
            viajero.setEmail(traveler.getEmail());
            viajero.setApellido(traveler.getLname());
            viajeros.add(viajero);
        }
        return viajeros;
    }
}
